package com.example.blog_system.config;

import com.example.blog_system.common.AjaxResult;
import com.fasterxml.jackson.databind.ObjectMapper;
import lombok.SneakyThrows;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.MethodParameter;
import org.springframework.http.MediaType;
import org.springframework.http.server.ServerHttpRequest;
import org.springframework.http.server.ServerHttpResponse;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;

/**
 * Created with IntelliJ IDEA.
 * Description: 保底的统一格式 返回 做最后的数据统一格式的校验(已经是统一格式则进行转换, 是特殊情况进行处理转换)
 */
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {

    @Autowired
    private ObjectMapper objectMapper;

    //为true时 会执行beforeBodyWrite方法 进行统一格式的设置
    @Override
    public boolean supports(MethodParameter returnType, Class converterType) {
        return true;
    }

    @SneakyThrows
    @Override
    public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
        //返回格式已经是AjaxResult 则直接返回
        if(body instanceof AjaxResult) {
            return body;
        }

        //字符串作为返回的数据 要特殊转换成统一格式  手动将打包后的AjaxResult对象转换成js字符串返回 这是一种处理办法 但是返回的是js字符串不是java对象故而没有转换为js对象
//        if(body instanceof String){
//            return  objectMapper.writeValueAsString(AjaxResult.success(body));
//        }


        // 没有统一返回格式的一律 则将其构造成统一格式对象 其在统一处理前都会通过HttpMessageConverter类型转换 再打包成Ajax对象 返回 会自动转换为js对象
        return AjaxResult.success(body);
    }


}
